
package org.sql.commands.mysql.clause;

// *************************************************************************/
// Charada Soft
// Area de Desarrollo de Sistemas de Información
// *************************************************************************/
// Proyecto : java connector sql 
// Archivo : Having.java
// Descripcion : Clase Having
// *************************************************************************/
// Version : 2.10.4
// Fecha de Creación: 26 de Septiembre de 2014
// Author : Daniel Andres Castillo Pedroza
// *************************************************************************/

import java.util.ArrayList;
import org.sql.commands.Clause;
import org.sql.commands.exception.DMLException;
import org.sql.commands.mysql.filter.Condition;

public class Having implements Clause {
    
    // Atributos de la clase Having
    
    private ArrayList <Condition> conditions;
    
    // Constructor de la clase Having
    
    public Having() {
      conditions = new ArrayList();
    }

    // Metodos de la clase Having
    
    /**
      * 
      * @param conditions 
    */
    
    public void setConditions(ArrayList <Condition> conditions) {
      this.conditions = conditions;
    }
    
    /**
      * 
      * @param condition
    */
    
    public void addCondition(Condition condition) {
      conditions.add(condition);
    }
    
    // Metodos estáticos de la clase Having
    
    /**
      * 
      * @param condition
      * @return 
    */
    
    public static Having creatorClause(Condition condition) {
      Having having = new Having(); having.addCondition(condition);
      
      return having; // Retornando Objeto HAVING
    }
    
    /**
      * 
      * @param conditions
      * @return 
    */
    
    public static Having creatorClause(ArrayList <Condition> conditions) {
      Having having = new Having(); having.setConditions(conditions);
      
      return having; // Retornando Objeto HAVING
    }

    // Metodos sobreescritos de la clase Where
    
    @Override
    public String getClause() throws DMLException {
      if ((conditions == null) || (conditions.isEmpty())) {
        throw new DMLException(DMLException.CONDITIONS_UNDEFINED);
      } // No ha definido las Condiciones de la Clausula
        
      String cadenaConditions = ""; // Declarando dato para Proceso
      
      for (int index = 0; index < conditions.size(); index++) {
        // Selecciando Filtro de la Lista
        Condition condition = conditions.get(index);
        
        if (index != 0) {
          cadenaConditions += " " + condition.getConnector();
          cadenaConditions += " " + condition.getFilter();
        } // No es el Primer filtro del Array
        
        else {
          cadenaConditions += condition.getFilter();  
        } // Es el Primer filtro del Array
      } // Recorriendo el Array de Filtros del Having
      
      return "HAVING(" + cadenaConditions + ")"; // Retornando Clausula HAVING
    }
}